package com.mo.lib.utils.data

import java.util.regex.Pattern

/**
 * @ author：mo
 * @ data：2022/4/21:11:21
 * @ 功能：正则相关
 * 原文链接：http://caibaojian.com/regexp-example.html
 * 提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
 * 提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
 * 提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
 * 提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
 * 提取信息中的中国电话号码（包括移动和固定电话）:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
 * 提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
 * 提取信息中的中国身份证号码:\d{18}|\d{15}
 * 提取信息中的整数：\d+
 * 提取信息中的浮点数（即小数）：(-?\d*)\.?\d+
 * 提取信息中的任何数字 ：(-?\d*)(\.\d+)?
 * 提取信息中的中文字符串：[\u4e00-\u9fa5]*
 * 提取信息中的双字节字符串 (汉字)：[^\x00-\xff]*
 */


/** 电话号码*/
const val REGEX_TEL = "^0\\d{2,3}[- ]?\\d{7,8}"

/** 身份证号码15位*/
const val REGEX_IDCARD15 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$"

/** 身份证号码15位*/
const val REGEX_IDCARD18 = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])$"

/** 身份证号码15或18位 包含以x结尾*/
const val REGEX_IDCARD = "(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$|^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|x|X)$)"

/** 邮箱*/
const val REGEX_EMAIL = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"

/** URL*/
const val REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?"

/** 汉字*/
const val REGEX_CHZ = "^[\\u4e00-\\u9fa5]+$"

/** 用户名，取值范围为a-z,A-Z,0-9,"_",汉字，不能以"_"结尾,用户名必须是6-20位*/
const val REGEX_USERNAME = "^[\\w\\u4e00-\\u9fa5]{6,20}(?<!_)$"

/**密码正则  6-16位，由数字和字母组合*/
fun RegexPassWord(min: Int = 6, max: Int = 16) = StringBuffer("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]").append("{${min},${max}}$").toString()
/** 邮箱正则*/
const val RegexEmail = "(^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$)"

/** 银行卡号正则*/
const val RegexBankNumber = "(^[0-9]{9,25}$)"

/** yyyy-MM-dd格式的日期校验，已考虑平闰年*/
const val REGEX_DATE = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$"

/** IP地址*/
const val REGEX_IP = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"

/**根据某正则，判定字符串 */
fun regex(regexStr: String,str: String) = Pattern.matches(regexStr, str)
@JvmOverloads
fun isPassWord(str: String, min: Int = 6, max: Int = 16) = regex(RegexPassWord(min,max), str)
fun isEmail(str: String) = regex(RegexEmail, str)
fun isBankNumber(str: String) = regex(RegexBankNumber, str)

/**  判断是否是车牌号包括新能源     "^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[ADF])|([ADF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使]{1})$"*/
fun isNewCarNumber(carNumber: String): Boolean { //
    val p = Pattern.compile("^(([\\u4e00-\\u9fa5]{1}[A-Z]{1})[-]?|([wW][Jj][\\u4e00-\\u9fa5]{1}[-]?)" + "|([a-zA-Z]{2}))([A-Za-z0-9]{5}|[DdFf][A-HJ-NP-Za-hj-np-z0-9][0-9]{4}|[0-9]{5}[DdFf])" + "|^[冀豫云辽黑湘皖鲁苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼渝京津沪新京军空海北沈兰济南广成使领A-Z]" + "{1}[a-zA-Z0-9]{5}[a-zA-Z0-9挂学警港澳]{1}$")
    val m = p.matcher(carNumber.trim { it <= ' ' })
    if (m.matches()) {
        val substring = carNumber.substring(1)
        return !(substring.contains("O") || substring.contains("o") || substring.contains("I") || substring.contains("i"))
    }
    return false
}